// (C) 1996 G.J. Smit, Nijmegen, Nederland
// This software is published under the GNU General Public License v3.0
// www.dbphysics.com
// The program 'Newton' is a n-body model where simultaneously for the positions of multiple dimensional basics (theoretical infinite curvature) moving through space time interact with each other according to newtonian laws.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <float.h>
#include <math.h>
#include <graphics.h>

FILE *bestand;             // Pointer voor geopend bestand.
char b_naam[12];           // Naam van actief bestand.
char b_test;               // Controle voor bestaan bestand.
char toets;                // Variabele voor ingedrukte toets.
int t1,t2,t3,t4;           // Tellers voor lussen.
int stap,dim,deel;         // Aantal stappen, dimensies en deeltjes.
int spoor;                 // Lengte afbeelding in tijd per deeltje.
int prog;                  // Programma einde.
int i_temp;                // Tijdelijk opslag integer.
int midd;                  // Middelpunt in tekening aan/uit.
int modus;                 // Kleur per deel/diepte.
float w_g, w_x, w_y;       // Windowgrootte, x en y cordinaatgrootte.
float x_max, y_max;        // Aantal pixels op beeldscherm.
float t_frag, grens;       // Tijdfragmentatie en grenswaarde ruimte.
float r_o, r_n;            // Bereik willekeurige begincordinaten.
float fzx, fzy, fzz;       // Zwaartekracht per as.
float g_temp;              // Grenswaarde wisseling.
float f_temp;              // Tijdelijk opslag float.
float midx, midy;          // Middelpunt berekening-variabelen.
float diepte;              // Kleur-diepte variabele.
float huge x3[251][4];     // Maximaal 250 x3d-cordinaten.
float huge y3[251][4];     // Maximaal 250 y3d-cordinaten.
float huge z3[251][4];     // Maximaal 250 z3d-cordinaten.
float huge x2[251][30];    // Maximaal 30 x2d-cordinaten per deeltje.
float huge y2[251][30];    // Maximaal 30 y2d-cordinaten per deeltje.

void theorie(void) // Rekenkundig variabele verhoudingen.
{ detectgraph(&t1, &t2);
  initgraph(&t1, &t2, "..\\bgi");
  setcolor(7);
  for(t1=0; t1<20; t1++)
  { line(x_max/2+200-t1*10, y_max/2, x_max/2, y_max/2+t1*10);
    line(x_max/2-t1*10, y_max/2, x_max/2, y_max/2+200-t1*10);
    line(x_max/2-200+t1*10, y_max/2, x_max/2, y_max/2-t1*10);
    line(x_max/2+t1*10, y_max/2, x_max/2, y_max/2-200+t1*10);
  }
  getch();
  closegraph();
}

void varbestand(void) // Variabele waarden bestand inlezen.
{ bestand=fopen(b_naam,"r");
  if(bestand==NULL) b_test=0;
  else
  { fscanf(bestand, "%d%d%f%f%f%f", &stap, &deel, &r_o, &r_n, &t_frag, &grens);
    if(grens!=0) w_g=1.5*grens;
    b_test=1;
  }
  fclose(bestand);
}

void menuopbeeld(void)
{ clrscr();
  textcolor(10);
  printf("[b]estandsnaam  ");
  if(b_test==0) printf("-"); else printf("+");
  printf("  : %s\n\n", b_naam);
  printf("[c]ordinaten\n");
  printf("[w]illekeur        : %f\n", r_o);
  printf("[r]ichting         : %f\n\n", r_n);
  printf("[t]ijdfragmentatie : %f\n", t_frag);
  printf("[g]rens            : %f\n\n", grens);
  printf("[s]tappen          : %d\n", stap);
  printf("[d]eel             : %d\n\n", deel);
  printf("[v]enster          : %f\n", w_g);
  printf("[p]rojectie        : %d\n", spoor);
  printf("[m]iddelpunt       : ");
  if(midd==0) printf("uit\n"); else printf("aan\n");
  printf("[k]leurmodus       : ");
  if(modus==0) printf("deel\n\n\n"); else printf("diepte\n\n\n");
  printf("[R]ekenen [E]n [T]ekenen [S]toppen\n\n");
}

void menuvraag(void)
{ toets=getch();
  if(toets==98)  { printf("Nieuwe bestandsnaam? ");
                   scanf("%s", &b_naam); }
  if(toets==99)  { printf("Invoer cordinaten, nog programmeren...");
                   getch(); }
  if(toets==119) { f_temp=r_o; printf("Maximale willekeur? "); 
                   scanf("%f", &r_o); 
                   if(r_o<0||r_o==0||r_o>30000) r_o=f_temp; }         
  if(toets==114) { f_temp=r_n; printf("Maximale richting? ");
                   scanf("%f", &r_n);
                   if(r_n<0||r_o==0||r_o>2500) r_o=f_temp; }
  if(toets==116) { f_temp=t_frag; printf("Nieuwe tijdfragmentatie? ");
                   scanf("%f", &t_frag);
                   if(t_frag<0||t_frag==0||t_frag>1) t_frag=f_temp; }
  if(toets==103) { f_temp=grens; printf("Grens van ruimte? ");
                   scanf("%f", &grens);
                   if(grens<0||grens>32500) grens=f_temp; }
  if(toets==115) { i_temp=stap; printf("Aantal stappen? ");
                   scanf("%d", &stap);
                   if(stap<1||stap>32500) stap=i_temp; }
  if(toets==100) { i_temp=deel; printf("Aantal deeltjes? ");
                   scanf("%d", &deel);
                   if(deel<2||deel>250) deel=i_temp; }
  if(toets==118) { f_temp=w_g; printf("Venstergrootte? ");
                   scanf("%f", &w_g);
                   if(w_g<0||w_g==0||w_g>32500) w_g=f_temp; }
  if(toets==112) { i_temp=spoor; printf("Aantal fragmenten? ");
                   scanf("%d", &spoor);
                   if(spoor<0||spoor>30) spoor=i_temp; }
  if(toets==109) { if(midd==0) midd=1; else midd=0; }
  if(toets==107) { if(modus==0) modus=1; else modus=0; }
}

void willekeur(void)
{ for(t1=0;t1<deel;t1++)
  { x3[t1][0]=2*(random(32767)*r_o/32767)-r_o;
    y3[t1][0]=2*(random(32767)*r_o/32767)-r_o;
    z3[t1][0]=2*(random(32767)*r_o/32767)-r_o;
    x3[t1][1]=x3[t1][0]+2*(random(32767)*r_n/32767)-r_n;
    y3[t1][1]=y3[t1][0]+2*(random(32767)*r_n/32767)-r_n;
    z3[t1][1]=z3[t1][0]+2*(random(32767)*r_n/32767)-r_n;
  }
}
                  
void reken(void) // Kaal [R]ekenen, snelste routine.
{ // Bestand voor cordinaten openen.
  bestand=fopen(b_naam,"w");
  fprintf(bestand, "%d %d %f %f %f %f", stap, deel, r_o, r_n, t_frag, grens);
  for(t1=0;t1<deel;t1++)
  fprintf(bestand, " %f %f %f", x3[t1][1], y3[t1][1], z3[t1][1]);
 
  // Cordinaten berekenen, schrijven naar disk en naar tekst-beeldscherm.
  for(t1=0;t1<stap;t1++)                                  
  { for(t2=0;t2<deel;t2++) 
    { x3[t2][3]=0;
      y3[t2][3]=0;
      z3[t2][3]=0; 
    }
    for(t2=0;t2<deel;t2++)
    { x3[t2][2]=x3[t2][1]-x3[t2][0];
      y3[t2][2]=y3[t2][1]-y3[t2][0];
      z3[t2][2]=z3[t2][1]-z3[t2][0];
      for(t3=t2;t3<deel;t3++)
      { fzx=x3[t3][1]-x3[t2][1];
        fzy=y3[t3][1]-y3[t2][1];
        fzz=z3[t3][1]-z3[t2][1];
        if(fzx!=0) { fzx=1/fzx; x3[t2][3]=x3[t2][3]+fzx;
                                x3[t3][3]=x3[t3][3]-fzx; }
        if(fzy!=0) { fzy=1/fzy; y3[t2][3]=y3[t2][3]+fzy;
                                y3[t3][3]=y3[t3][3]-fzy; }
        if(fzz!=0) { fzz=1/fzz; z3[t2][3]=z3[t2][3]+fzz;
                                z3[t3][3]=z3[t3][3]-fzz; }
      }
      x3[t2][0]=x3[t2][1];
      y3[t2][0]=y3[t2][1];
      z3[t2][0]=z3[t2][1];
      x3[t2][1]=x3[t2][0]+x3[t2][2]+x3[t2][3];
      y3[t2][1]=y3[t2][0]+y3[t2][2]+y3[t2][3];
      z3[t2][1]=z3[t2][0]+z3[t2][2]+z3[t2][3];
    }
    for(t2=0;t2<deel;t2++) 
    fprintf(bestand, " %f %f %f", x3[t2][1], y3[t2][1], z3[t2][1]);
    putchar(13); printf("%d",t1+1);
  }
  fclose(bestand);
  b_test=1;
}  

void rekenmetopties(void) // [R]ekenen met grens en/of t_frag aan.
{ // Bestand voor cordinaten openen.
  bestand=fopen(b_naam,"w");
  fprintf(bestand, "%d %d %f %f %f %f", stap, deel, r_o, r_n, t_frag, grens);
  for(t1=0;t1<deel;t1++)
  fprintf(bestand, " %f %f %f", x3[t1][1], y3[t1][1], z3[t1][1]);
 
  // Cordinaten berekenen, schrijven naar disk en naar tekst-beeldscherm.
  for(t1=0;t1<stap;t1++)                                  
  { for(t2=0;t2<deel;t2++) 
    { x3[t2][3]=0;
      y3[t2][3]=0;
      z3[t2][3]=0; 
    }
    for(t2=0;t2<deel;t2++)
    { x3[t2][2]=x3[t2][1]-x3[t2][0];
      y3[t2][2]=y3[t2][1]-y3[t2][0];
      z3[t2][2]=z3[t2][1]-z3[t2][0];
      for(t3=t2;t3<deel;t3++)
      { fzx=x3[t3][1]-x3[t2][1];
        fzy=y3[t3][1]-y3[t2][1];
        fzz=z3[t3][1]-z3[t2][1];
        if(fzx!=0) { fzx=1/fzx; x3[t2][3]=x3[t2][3]+fzx;
                                x3[t3][3]=x3[t3][3]-fzx; }
        if(fzy!=0) { fzy=1/fzy; y3[t2][3]=y3[t2][3]+fzy;
                                y3[t3][3]=y3[t3][3]-fzy; }
        if(fzz!=0) { fzz=1/fzz; z3[t2][3]=z3[t2][3]+fzz;
                                z3[t3][3]=z3[t3][3]-fzz; }
      }
      // Bewerk cordinaten als t_frag ongelijk aan 1.
      if(t_frag!=1)
      { x3[t2][2]=x3[t2][2]*t_frag; x3[t2][3]=x3[t2][3]*t_frag;
        y3[t2][2]=y3[t2][2]*t_frag; y3[t2][3]=y3[t2][3]*t_frag;
        z3[t2][2]=z3[t2][2]*t_frag; z3[t2][3]=z3[t2][3]*t_frag;
      }
      // Bepaal de nieuwe cordinaten.
      x3[t2][0]=x3[t2][1];
      y3[t2][0]=y3[t2][1];
      z3[t2][0]=z3[t2][1];
      x3[t2][1]=x3[t2][0]+x3[t2][2]+x3[t2][3];
      y3[t2][1]=y3[t2][0]+y3[t2][2]+y3[t2][3];
      z3[t2][1]=z3[t2][0]+z3[t2][2]+z3[t2][3];
      // Test grensoverschrijding.
      if(grens>0)
      { if(x3[t2][1]<-grens||x3[t2][1]>grens)
        { g_temp=x3[t2][1]; x3[t2][1]=-x3[t2][0]; x3[t2][0]=-g_temp; }
        if(y3[t2][1]<-grens||y3[t2][1]>grens)
        { g_temp=y3[t2][1]; y3[t2][1]=-y3[t2][0]; y3[t2][0]=-g_temp; }
        if(z3[t2][1]<-grens||z3[t2][1]>grens)
        { g_temp=z3[t2][1]; z3[t2][1]=-z3[t2][0]; z3[t2][0]=-g_temp; }
      }
    }
    for(t2=0;t2<deel;t2++) 
    fprintf(bestand, " %f %f %f", x3[t2][1], y3[t2][1], z3[t2][1]);
    putchar(13); printf("%d",t1+1);
  }
  fclose(bestand);
  b_test=1;
}  

void rekenenteken(void) // [E]n.
{ detectgraph(&t1, &t2);
  initgraph(&t1, &t2, "..\\bgi");
  w_x=(x_max+1)/(w_g*2); w_y=(y_max+1)/(w_g*2);
  printf("     |%d|%d|%f|%f|%f|%f|%f|%d|%s",
         stap, deel, r_o, r_n, t_frag, grens, w_g, spoor, b_naam);
  gotoxy(0,0);
  midd=0; spoor=0; modus=0;

  // Bestand voor cordinaten openen.
  bestand=fopen(b_naam,"w");
  fprintf(bestand, "%d %d %f %f %f %f", stap, deel, r_o, r_n, t_frag, grens);
  for(t1=0;t1<deel;t1++)
  fprintf(bestand, " %f %f %f", x3[t1][1], y3[t1][1], z3[t1][1]);
 
  // Cordinaten berekenen, schrijven naar disk en naar grafisch beeldscherm.
  for(t1=0;t1<stap;t1++)                                  
  { for(t2=0;t2<deel;t2++) 
    { x3[t2][3]=0;
      y3[t2][3]=0;
      z3[t2][3]=0; 
    }
    for(t2=0;t2<deel;t2++)
    { x3[t2][2]=x3[t2][1]-x3[t2][0];
      y3[t2][2]=y3[t2][1]-y3[t2][0];
      z3[t2][2]=z3[t2][1]-z3[t2][0];
      for(t3=t2;t3<deel;t3++)
      { fzx=x3[t3][1]-x3[t2][1];
        fzy=y3[t3][1]-y3[t2][1];
        fzz=z3[t3][1]-z3[t2][1];
        if(fzx!=0) { fzx=1/fzx; x3[t2][3]=x3[t2][3]+fzx;
                                x3[t3][3]=x3[t3][3]-fzx; }
        if(fzy!=0) { fzy=1/fzy; y3[t2][3]=y3[t2][3]+fzy;
                                y3[t3][3]=y3[t3][3]-fzy; }
        if(fzz!=0) { fzz=1/fzz; z3[t2][3]=z3[t2][3]+fzz;
                                z3[t3][3]=z3[t3][3]-fzz; }
      }
      // Bewerk cordinaten als t_frag ongelijk aan 1.
      if(t_frag!=1)
      { x3[t2][2]=x3[t2][2]*t_frag; x3[t2][3]=x3[t2][3]*t_frag;
        y3[t2][2]=y3[t2][2]*t_frag; y3[t2][3]=y3[t2][3]*t_frag;
        z3[t2][2]=z3[t2][2]*t_frag; z3[t2][3]=z3[t2][3]*t_frag;
      }
      // Bepaal de nieuwe cordinaten.
      x3[t2][0]=x3[t2][1];
      y3[t2][0]=y3[t2][1];
      z3[t2][0]=z3[t2][1];
      x3[t2][1]=x3[t2][0]+x3[t2][2]+x3[t2][3];
      y3[t2][1]=y3[t2][0]+y3[t2][2]+y3[t2][3];
      z3[t2][1]=z3[t2][0]+z3[t2][2]+z3[t2][3];
      // Test grensoverschrijding.
      if(grens>0)
      { if(x3[t2][1]<-grens||x3[t2][1]>grens)
        { g_temp=x3[t2][1]; x3[t2][1]=-x3[t2][0]; x3[t2][0]=-g_temp; }
        if(y3[t2][1]<-grens||y3[t2][1]>grens)
        { g_temp=y3[t2][1]; y3[t2][1]=-y3[t2][0]; y3[t2][0]=-g_temp; }
        if(z3[t2][1]<-grens||z3[t2][1]>grens)
        { g_temp=z3[t2][1]; z3[t2][1]=-z3[t2][0]; z3[t2][0]=-g_temp; }
      }
    }
    for(t2=0;t2<deel;t2++) 
    fprintf(bestand, " %f %f %f", x3[t2][1], y3[t2][1], z3[t2][1]);
    for(t2=0;t2<deel;t2++)
    { x2[t2][0]=y3[t2][1]-.5*x3[t2][1];
      y2[t2][0]=z3[t2][1]+.5*x3[t2][1];
      x2[t2][0]=x_max/2-w_x*x2[t2][0];
      y2[t2][0]=y_max/2-w_y*y2[t2][0];
      putpixel(x2[t2][0],y2[t2][0],2+t2);
    }
    putchar(13); printf("%d",t1+1);
  }
  putchar(13); printf("Klaar");
  fclose(bestand);
  b_test=1;
  getch();
  closegraph();
}  

void geendisk(void) // [A]lleen rekenen en tekenen.
{ detectgraph(&t1, &t2);
  initgraph(&t1, &t2, "..\\bgi");
  w_x=(x_max+1)/(w_g*2); w_y=(y_max+1)/(w_g*2);
  if(modus!=0) diepte=255/(w_g*2);

  printf("     |%d|%d|%f|%f|%f|%f|%f|%d|XXXXXX",
         stap, deel, r_o, r_n, t_frag, grens, w_g, spoor);
  gotoxy(0,0);

  // Cordinaten berekenen, schrijven naar grafisch beeldscherm.
  for(t1=0;t1<stap;t1++)                                  
  { for(t2=0;t2<deel;t2++) 
    { x3[t2][3]=0;
      y3[t2][3]=0;
      z3[t2][3]=0; 
    }
    putchar(13);printf("%d", t1);
    if(midd>0) { midx=0; midy=0; }
    for(t2=0;t2<deel;t2++)
    { x3[t2][2]=x3[t2][1]-x3[t2][0];
      y3[t2][2]=y3[t2][1]-y3[t2][0];
      z3[t2][2]=z3[t2][1]-z3[t2][0];
      for(t3=t2;t3<deel;t3++)
      { fzx=x3[t3][1]-x3[t2][1];
        fzy=y3[t3][1]-y3[t2][1];
        fzz=z3[t3][1]-z3[t2][1];
        if(fzx!=0) { fzx=1/fzx; x3[t2][3]=x3[t2][3]+fzx;
                                x3[t3][3]=x3[t3][3]-fzx; }
        if(fzy!=0) { fzy=1/fzy; y3[t2][3]=y3[t2][3]+fzy;
                                y3[t3][3]=y3[t3][3]-fzy; }
        if(fzz!=0) { fzz=1/fzz; z3[t2][3]=z3[t2][3]+fzz;
                                z3[t3][3]=z3[t3][3]-fzz; }
      }
      // Bewerk cordinaten als t_frag ongelijk aan 1.
      if(t_frag!=1)
      { x3[t2][2]=x3[t2][2]*t_frag; x3[t2][3]=x3[t2][3]*t_frag;
        y3[t2][2]=y3[t2][2]*t_frag; y3[t2][3]=y3[t2][3]*t_frag;
        z3[t2][2]=z3[t2][2]*t_frag; z3[t2][3]=z3[t2][3]*t_frag;
      }
      // Bepaal de nieuwe cordinaten.
      x3[t2][0]=x3[t2][1];
      y3[t2][0]=y3[t2][1];
      z3[t2][0]=z3[t2][1];
      x3[t2][1]=x3[t2][0]+x3[t2][2]+x3[t2][3];
      y3[t2][1]=y3[t2][0]+y3[t2][2]+y3[t2][3];
      z3[t2][1]=z3[t2][0]+z3[t2][2]+z3[t2][3];
      // Test grensoverschrijding.
      if(grens>0)
      { if(x3[t2][1]<-grens||x3[t2][1]>grens)
        { g_temp=x3[t2][1]; x3[t2][1]=-x3[t2][0]; x3[t2][0]=-g_temp; }
        if(y3[t2][1]<-grens||y3[t2][1]>grens)
        { g_temp=y3[t2][1]; y3[t2][1]=-y3[t2][0]; y3[t2][0]=-g_temp; }
        if(z3[t2][1]<-grens||z3[t2][1]>grens)
        { g_temp=z3[t2][1]; z3[t2][1]=-z3[t2][0]; z3[t2][0]=-g_temp; }
      }
    }
    for(t2=0;t2<deel;t2++)
    { x2[t2][0]=y3[t2][1]-.5*x3[t2][1];
      y2[t2][0]=z3[t2][1]+.5*x3[t2][1];
      if(midd>0)
      { midx=midx+x2[t2][0];
        midy=midy+y2[t2][0];
      }
    }
    if(midd>0) { midx=midx/deel; midy=midy/deel; }
    for(t2=0;t2<deel;t2++)
    { if(midd>0)
      { x2[t2][0]=x_max/2+midx-w_x*x2[t2][0];
        y2[t2][0]=y_max/2+midy-w_y*y2[t2][0];
      }
      else
      { x2[t2][0]=x_max/2-w_x*x2[t2][0];
        y2[t2][0]=y_max/2-w_y*y2[t2][0];
      }
      if(modus==0) putpixel(x2[t2][0],y2[t2][0],2+t2);
      else putpixel(x2[t2][0],y2[t2][0],1+(x3[t2][1]+w_g)*diepte);
      if(spoor>0)
      { if(t1<spoor-1)
        { x2[t2][spoor-1-t1]=x2[t2][0]; y2[t2][spoor-1-t1]=y2[t2][0]; }
        else
        { putpixel(x2[t2][spoor-1],y2[t2][spoor-1],0);
          for(t3=spoor-1;t3>0;t3--)
          { x2[t2][t3]=x2[t2][t3-1]; y2[t2][t3]=y2[t2][t3-1]; }
        }
      }
    }
    putchar(13); printf("%d",t1+1);
  }
  putchar(13); printf("Klaar");
  getch();
  closegraph();
}  

void teken(void)
{ detectgraph(&t1, &t2);
  initgraph(&t1, &t2, "..\\bgi");
  // Berekenen hoeveelheid pixels per nheid.
  w_x=(x_max+1)/(w_g*2); w_y=(y_max+1)/(w_g*2);

  bestand=fopen(b_naam,"r");
  fscanf(bestand, "%d%d%f%f%f%f", &stap, &deel, &r_o, &r_n, &t_frag, &grens);
  printf("     |%d|%d|%f|%f|%f|%f|%f|%d|%s",
         stap, deel, r_o, r_n, t_frag, grens, w_g, spoor, b_naam);

  if(modus!=0) diepte=255/(w_g*2);
  for(t1=0;t1<stap+1;t1++) 
  { putchar(13);printf("%d", t1);
    if(midd>0) { midx=0; midy=0; }
    for(t2=0;t2<deel;t2++)
    fscanf(bestand, "%f%f%f", &x3[t2][1], &y3[t2][1], &z3[t2][1]);
    for(t2=0;t2<deel;t2++)
    { x2[t2][0]=y3[t2][1]-.5*x3[t2][1];
      y2[t2][0]=z3[t2][1]+.5*x3[t2][1];
      if(midd>0)
      { midx=midx+x2[t2][0];
        midy=midy+y2[t2][0];
      }
    }
    if(midd>0) { midx=midx/deel; midy=midy/deel; }
    for(t2=0;t2<deel;t2++)
    { if(midd>0)
      { x2[t2][0]=x_max/2+midx-w_x*x2[t2][0];
        y2[t2][0]=y_max/2+midy-w_y*y2[t2][0];
      }
      else
      { x2[t2][0]=x_max/2-w_x*x2[t2][0];
        y2[t2][0]=y_max/2-w_y*y2[t2][0];
      }
      if(modus==0) putpixel(x2[t2][0],y2[t2][0],2+t2);
      else putpixel(x2[t2][0],y2[t2][0],1+(x3[t2][1]+w_g)*diepte);
      if(spoor>0)
      { if(t1<spoor-1)
        { x2[t2][spoor-1-t1]=x2[t2][0]; y2[t2][spoor-1-t1]=y2[t2][0]; }
        else
        { putpixel(x2[t2][spoor-1],y2[t2][spoor-1],0);
          for(t3=spoor-1;t3>0;t3--)
          { x2[t2][t3]=x2[t2][t3-1]; y2[t2][t3]=y2[t2][t3-1]; }
        }
      }
    }
  }
  putchar(13); printf("Klaar");
  fclose(bestand);  
  getch();
  closegraph();
}

void main(void)
{ // Beginwaarden zetten.
  stap=250; deel=3; r_o=100; r_n=.0001; t_frag=1; grens=0; w_g=500; spoor=0;
  midd=0; spoor=0; modus=0;
  clrscr(); textcolor(10);

  // Grafische modus bepalen.
  detectgraph(&t1, &t2);
  initgraph(&t1, &t2, "..\\bgi");
  x_max=getmaxx(); y_max=getmaxy();
  closegraph();

  // Test of standaard bestand bestaat.
  strcpy(b_naam, "bestand.xyz");
  b_test=0;
  varbestand();

  // Begin programma-lus.
  prog=1;
  do
  { menuopbeeld();
    toets=0;
    menuvraag();
    // [b]estandsnaam.
    if(toets==98) varbestand();
    // [R]eken.
    if(toets==82)  
    { if(b_test==1) 
      { printf("Bestand %s overschrijven? [j/n] ", b_naam);
        i_temp=getch();
        putchar(13); printf("                                            ");
        putchar(13);
        if(i_temp==106) b_test=0; 
      } 
      if(b_test==0)
      { willekeur();
        if(grens>0||t_frag!=1) rekenmetopties(); else reken();
      }
    }
    if(toets==69)
    { if(b_test==1) 
      { printf("Bestand %s overschrijven? [j/n] ", b_naam);
        i_temp=getch();
        putchar(13); printf("                                            ");
        putchar(13);
        if(i_temp==106) b_test=0; 
      } 
      if(b_test==0)
      { willekeur();
        rekenenteken();
      }
    }
    // [T]eken.
    if(toets==84)  teken();
    if(toets==65)  { willekeur(); geendisk(); }
    if(toets==81)  theorie();
    if(toets==63)  { printf("Bedacht en geschreven door G.J.Smit.");
                     getch(); }
    if(toets==83)  prog=0;
  } while(prog>0);
}